home *** CD-ROM | disk | FTP | other *** search
- #! /usr/bin/python
-
- import os
- import sys
- import py_compile
-
- def compile_files(files, ddir=None, force=0, rx=None, quiet=0, ignore=0):
- """Byte-compile all file.
- file: the file to byte-compile
- ddir: if given, purported directory name (this is the
- directory name that will show up in error messages)
- force: if 1, force compilation, even if timestamps are up-to-date
- quiet: if 1, be quiet during compilation
-
- """
-
- success = 1
- dfile = None
- for fullname in files:
- if rx is not None:
- mo = rx.search(fullname)
- if mo:
- continue
- if os.path.isdir(fullname):
- continue
- elif not os.path.isfile(fullname):
- print "file does not exist:", fullname
- success = 0
- elif fullname[-3:] == '.py':
- cfile = fullname + (__debug__ and 'c' or 'o')
- ftime = os.stat(fullname).st_mtime
- try: ctime = os.stat(cfile).st_mtime
- except os.error: ctime = 0
- if (ctime > ftime) and not force: continue
- if not quiet:
- print 'Compiling', fullname, '...'
- try:
- ok = py_compile.compile(fullname, None, dfile, True)
- except KeyboardInterrupt:
- raise KeyboardInterrupt
- except py_compile.PyCompileError,err:
- if quiet:
- print 'Compiling', fullname, '...'
- print err.msg
- success = 0
- except (MemoryError, SyntaxError),err:
- if quiet:
- print 'Compiling', fullname, '...'
- print err.msg
- success = 0
- except IOError, e:
- print "Sorry", e
- success = 0
- else:
- if ok == 0:
- success = 0
- if not success and ignore:
- print "Errors were ignored."
- return success or ignore
-
- def main():
- """Script main program."""
- import getopt
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'lfiqd:x:')
- except getopt.error, msg:
- print msg
- print "usage: python compilefiles.py [-f] [-q] [-i] " \
- "[-x regexp] [file ...] [-]"
- print "-f: force rebuild even if timestamps are up-to-date"
- print "-i: ignore errors during byte compilation"
- print "-q: quiet operation"
- print "-x regexp: skip files matching the regular expression regexp"
- print " the regexp is search for in the full path of the file"
- sys.exit(2)
- ddir = None
- force = 0
- quiet = 0
- ignore = 0
- rx = None
- for o, a in opts:
- if o == '-d': ddir = a
- if o == '-f': force = 1
- if o == '-i': ignore = 1
- if o == '-q': quiet = 1
- if o == '-x':
- import re
- rx = re.compile(a)
- if ddir:
- if len(args) != 1:
- print "-d destdir require exactly one directory argument"
- sys.exit(2)
- success = 1
-
- try:
- files = []
- for arg in args:
- if arg == '-':
- while 1:
- line = sys.stdin.readline()
- if not line:
- break
- files.append(line[:-1])
- else:
- files.append(arg)
- if not files:
- print "py_compilefiles: no files to compile"
- elif not compile_files(files, ddir, force, rx, quiet, ignore):
- success = 0
- except KeyboardInterrupt:
- print "\n[interrupt]"
- success = 0
- return success
-
- if __name__ == '__main__':
- exit_status = int(not main())
- sys.exit(exit_status)
-